/*
 * XSLTransform.cpp
 *
 *  Created on: 29 mars 2011
 *      Author: valbert
 */

#include "XSLTransform.h"
#include <iostream>


using namespace std;

XSLTransform::XSLTransform(){}

XSLTransform::XSLTransform(StructureXml xslt)
{
	this->xslt = xslt;
}

void XSLTransform::DeeperTransform(ElementXml& elementCourantHTML, list<ElementXml> elementsXMLCourant)
{

	list<ElementXml>::iterator itXML = elementsXMLCourant.begin();

	while (itXML != elementsXMLCourant.end())
	{
		// Recherche d'un element XSLT correspondant
		// Operation facilite par le fait que tous les elements xsl sont au meme niveau.
		ElementXml elementCourantXSLT=xslt.GetRoot().seekMatchAttValue((*itXML).GetName());

		//Si l'element recherché a été trouvé dans le Xslt
		if(elementCourantXSLT.GetLevel()!=-1)
		{
			ElementXml tempCourantXSLT = elementCourantXSLT;

			list<ElementXml> children;
			children = tempCourantXSLT.GetChildList();
			list<ElementXml>::iterator it = children.begin();

			bool finXSLT=false;
//			bool first = true;
//			ElementXml tampon = elementCourantHTML;
			while (!finXSLT)
			{

				if((*it).GetName()!="xsl:apply-templates")
				{
//					if(!first)
//					{
//						tampon = tampon.GetDescent().front();
//					}
					elementCourantHTML.AddChild((*it).GetName(),(*it).GetContent()).AddContent((*itXML).GetContent());


				}
				else
				{

					ElementXml mark = elementCourantHTML.GetChildList().back();
					elementCourantHTML.RemoveBack();
					DeeperTransform(mark, (*itXML).GetChildList());
					elementCourantHTML.AddChild(mark);
					finXSLT=true;
				}
				it=(*it).GetChildList().begin();
//				first = false;
			}

		}
		else
		{
			// mal gere pr linstant
			DeeperTransform(elementCourantHTML,(*itXML).GetChildList());
		}
		itXML++;
	}




}

StructureXml XSLTransform::Transform(StructureXml xml)
{
	//Initialisation du document HTML
	StructureXml documentHTML("html","");
	ElementXml& elementCourantHTML=documentHTML.GetRoot();

	//Initialisation de l'element courant XML
	list<ElementXml> lXML;
	lXML.push_front(xml.GetRoot());


	DeeperTransform(elementCourantHTML, lXML);

	return documentHTML;
}

